package com.jjh.users.util;

import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.jjh.common.util.ConstatFinalUtil;
import com.jjh.common.util.DateUtil;
import com.jjh.common.util.PageInfoUtil;
import com.jjh.common.util.RedisUtil;
import com.jjh.users.service.IUsersDbService;
import com.jjh.users.service.IUsersOperService;

/**
 * 测试crondTask(定时和间隔)
 * 
 * @author lby
 */
@Component
public class SpringTaskUtil
{
	@Autowired
	private IUsersOperService usersOperService;
	@Autowired
	private IUsersDbService usersDbService;
	@Autowired
	private RedisUtil redisUtil;
	@Autowired
	private DateUtil dateUtil;

	/**
	 * 定时任务 1/3:每隔3秒钟的第二秒执行(0,1-执行),2 3:只要秒数是3的时候执行
	 * 
	 * {秒} {分} {时} {日期（具体哪天）} {月} {星期} 30 * * * * ?
	 */
//	@Scheduled(cron = "20 0 0 * * ?")
//	public void method1() {
//		ConstatFinalUtil.SYS_LOGGER.info("==method1==开始");
//		Date now = new Date();
//		JSONObject resultJSON = this.usersOperService.saveOneStatResService(now);
//		ConstatFinalUtil.SYS_LOGGER.info("==method1==结束:{}",resultJSON);
//	}

//	@Scheduled(cron = "2/10 * * * * ?")
//	public void method2() {
//		ConstatFinalUtil.SYS_LOGGER.info("==method2==");
//	}
	/**
	 * 和Spring一样的理念 过去10秒的数据 比如说现在是00:00:10 计算的是00.00.00-->00.00.10 的数据 计算出来的结果a;
	 * 计算的是00.00.10-->00.00.20 的数据 计算出一个结果;a1 + a2; 今天计算出来一个结果：是否：a1
	 * +a2;先取redis的结果，新10秒的结果。存储到另外一个地方，就是另一个redis 比如说：现在是：00.00.30
	 * 计算的是00.00.20-->00.00.30的数据 计算一个结果;a;a+a3先取redis的结果；新10秒的结果存储到一个地方，redis
	 */
	@Scheduled(cron = "0/10 * * * * ?")
	public void method2()
	{
		/*
		 * 如果现在00.00.00-->00.00.10；先删除redis中的数据 从redis中取 10秒之前的所有数据的结果
		 * 如果取不到呢，表示没有；00.00.00把结果变成这个数据 如果去到了呢，就是10秒之前的结果 计算这10秒取到的结果
		 * 这10秒的结果之前的数据，就是最新的数据
		 */
		ConstatFinalUtil.SYS_LOGGER.info("==实时处理开始==");
		PageInfoUtil pageInfoUtil = new PageInfoUtil();
		Map<String, Object> condMap = new HashMap<String, Object>();
		int interval = 10;
		/* 如果现在是00.00.00-->00.00.10; 先删除redis中的数据 */

		/* 准备时间 */
		Calendar calendar = Calendar.getInstance();
		/* 判断删除时间的条件 */
		if (calendar.get(Calendar.HOUR_OF_DAY) == 0 && calendar.get(Calendar.MINUTE) == 0
				&& calendar.get(Calendar.SECOND) > 9 && calendar.get(Calendar.SECOND) <= interval + 5)
		{
			/* 每天00.00.10的时候是第一次。需要删除的是昨天的数据 */
			this.redisUtil.delete(RedisUtil.KEY_USERS_DATA);
			ConstatFinalUtil.SYS_LOGGER.info("==清空昨天数据了==");

			/* 执行离线任务 */
			Date now = new Date();
			JSONObject resultJSON = this.usersOperService.saveOneStatResService(now);
			ConstatFinalUtil.SYS_LOGGER.info("==method1==结束:{}", resultJSON);
		}
		/* 从redis中取数据，取键 */
		Object val = this.redisUtil.get(RedisUtil.KEY_USERS_DATA);
		/* 如果取不到表示没有数据；00.00.00，要把这个数据给清空 */
		/* 如果这个结果是之前的结果 */
		JSONObject dataJSON = new JSONObject();
		if (val != null)
		{
			/* 如果取到呢*取到的是10秒之前的结果 */
			/* 取到的数据时json,转换成字符串 */
			dataJSON = (JSONObject) JSON.parse(val + "");
		}
		/*
		 * 因为批处理是10秒钟 但是程序执行需要1分钟 spring会把它隔过去
		 */
		String dateNow = this.dateUtil.dateToStr(new Date());
		if (!dateNow.equalsIgnoreCase(dataJSON.getString("createTime")))
		{
			this.redisUtil.delete(RedisUtil.KEY_USERS_DATA);
			ConstatFinalUtil.SYS_LOGGER.info("==清空昨天数据完成(日期不相等)==");
		}
		/* 计算10秒的结果 */
		/**/
		condMap.put("operType", "dataStat");
		/* 准备开始时间 */
		Date edDate = calendar.getTime();
		/* 当前时间减去10秒 */
		calendar.add(Calendar.SECOND, -interval);
		/* 设置结束时间 */
		Date stDate = calendar.getTime();
		/* 添加 */
		condMap.put("st", stDate);
		condMap.put("ed", edDate);
		/* 始终只有一条记录，因为只查询今天的前10秒的数据 */
		List<Map<String, Object>> statLogList = this.usersDbService.statLogListService(pageInfoUtil, condMap);
		if (!statLogList.isEmpty())
		{
			Map<String, Object> map = statLogList.get(0);
			int totalCountTemp = Integer.parseInt(String.valueOf(map.get("totalCount")));
			/* 相加的结果 */
			int totalCount = 0;
			if (dataJSON.get("totalCount") != null)
			{
				totalCount = dataJSON.getIntValue("totalCount");
			}
			totalCount = totalCount + totalCountTemp;
			dataJSON.put("totalCount", totalCount);
			dataJSON.put("createTime", map.get("createTime"));
		}
		/* 这10秒的结果+10秒之前的结果，就是最新的数据 */
		/* 存储搭配redis中 */
		this.redisUtil.put(RedisUtil.KEY_USERS_DATA, dataJSON.toJSONString());
		ConstatFinalUtil.SYS_LOGGER.info("==实时处理结束==");
	}

}
